package bll

import (
	"errors"
	"jgt-oper/src/model"
	"jgt-oper/src/schema"
	"jgt-oper/src/util"
	"time"
)

// SystemParameter 系统参数管理
type SystemParameter struct {
	SystemParameterModel model.ISystemParameter `inject:"ISystemParameter"`
}

// QueryPage 查询分页数据
func (a *SystemParameter) QueryPage(params schema.SystemParameterQueryParam, pageIndex, pageSize uint) (int64, []*schema.SystemParameterQueryResult, error) {
	return a.SystemParameterModel.QueryPage(params, pageIndex, pageSize)
}

// Get 精确查询数据
func (a *SystemParameter) Get(recordID string) (*schema.SystemParameter, error) {
	return a.SystemParameterModel.Get(recordID)
}

// GetByCode 根据编号查询数据
func (a *SystemParameter) GetByCode(code string) (*schema.SystemParameter, error) {
	return a.SystemParameterModel.GetByCode(code)
}

// GetValueByCode 获取系统参数值
func (a *SystemParameter) GetValueByCode(code, defaultValue string) util.S {
	item, err := a.GetByCode(code)
	if err == nil && item != nil && item.Value != "" {
		defaultValue = item.Value
	}
	return util.S(defaultValue)
}

// Create 创建数据
func (a *SystemParameter) Create(item *schema.SystemParameter) error {
	exists, err := a.SystemParameterModel.CheckCode(item.Code)
	if err != nil {
		return err
	} else if exists {
		return errors.New("参数编号已经存在")
	}

	item.ID = 0
	item.RecordID = util.UUID()
	item.Created = time.Now().Unix()
	item.Deleted = 0
	return a.SystemParameterModel.Create(item)
}

// Update 更新数据
func (a *SystemParameter) Update(recordID string, item *schema.SystemParameter) error {
	oldItem, err := a.Get(recordID)
	if err != nil {
		return err
	} else if oldItem == nil {
		return errors.New("无效的数据")
	}

	if item.Code != oldItem.Code {
		exists, verr := a.SystemParameterModel.CheckCode(item.Code)
		if verr != nil {
			return verr
		} else if exists {
			return errors.New("参数编号已经存在")
		}
	}

	info := util.StructToMap(item)
	delete(info, "id")
	delete(info, "record_id")
	delete(info, "creator")
	delete(info, "created")
	delete(info, "deleted")
	return a.SystemParameterModel.Update(recordID, info)
}

// UpdateStatus 更新状态
func (a *SystemParameter) UpdateStatus(recordID string, status int) error {
	info := map[string]interface{}{
		"status": status,
	}
	return a.SystemParameterModel.Update(recordID, info)
}

// Delete 删除数据
func (a *SystemParameter) Delete(recordID string) error {
	return a.SystemParameterModel.Delete(recordID)
}
